import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.TouchScreen;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
public class test {
    //        Map<String, Object> deviceMetrics = new HashMap<String, Object>();
    //        deviceMetrics.put("width", 360);
    //        deviceMetrics.put("height", 640);
    //        deviceMetrics.put("pixelRatio", 3.0);
    //        Map<String, Object> mobileEmulation = new HashMap<String, Object>();
    //
    //        mobileEmulation.put("deviceMetrics", deviceMetrics);
    //        mobileEmulation.put("userAgent", "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19");
    //
    //        Map<String, Object> chromeOptions = new HashMap<String, Object>();
    //        chromeOptions.put("mobileEmulation", mobileEmulation);
    //        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
    //        capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
    //        driver = new ChromeDriver(capabilities);
    public static void main(String[] args) throws InterruptedException, IOException {
        System.setProperty("webdriver.chrome.driver", "C:\\Python2.7\\chromedriver.exe");
        ChromeOptions chromeOptions = new ChromeOptions();
//        chromeOptions.addArguments("--headless");
//        chromeOptions.addArguments("--disable-gpu");
        Map<String, Object> deviceMetrics = new HashMap<String, Object>();
        deviceMetrics.put("width", 360);
        deviceMetrics.put("height", 640);
        deviceMetrics.put("pixelRatio", 3.0);
        Map<String, Object> mobileEmulation = new HashMap<String, Object>();
//        mobileEmulation.put("deviceMetrics", deviceMetrics);
//        mobileEmulation.put("userAgent", "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19");
        mobileEmulation.put("deviceName", "iPhone X");
        deviceMetrics.put("mobileEmulation", mobileEmulation);
        chromeOptions.setExperimentalOption("mobileEmulation",mobileEmulation);
        ChromeDriver webDriver = new ChromeDriver(chromeOptions);
        webDriver.manage().window().setSize(new Dimension(400,800));
        webDriver.get("http://www.baidu.com");
        System.out.println(webDriver.getTitle());
        WebElement search =  webDriver.findElementByXPath("//div[@class='con-wrap']//input[@type='search']");
        search.sendKeys("张三他爸");
        search.submit();
//        WebElement kw = ((ChromeDriver) webDriver).findElementById("kw");
//        kw.sendKeys("测试搜索");
//        WebElement su = ((ChromeDriver) webDriver).findElementById("su");
//        su.click();
//        String title = webDriver.getTitle();
//        System.out.println(title);
//        String js = "var q = document.getElementById(\"kw\")\n" +
//                "q.style.border=\"2px solid red\"";
//        webDriver.executeScript(js);
//        webDriver.manage().window().setSize(new Dimension(320,480));

//        WebElement search_setting = webDriver.findElement(By.linkText("设置"));
//        Actions action = new Actions(webDriver);
//        action.clickAndHold(search_setting).perform();
        InputStream resourceAsStream = test.class.getClassLoader().getResourceAsStream("ss.js");
        String js = IOUtils.toString(resourceAsStream, Charset.forName("utf-8"));

        for (int i = 0; i < 10; i++) {
            webDriver.executeScript(js);
            Thread.sleep(3000);
            System.out.println("第"+i+"滚动");
        }
        //back() 模拟浏览器后退按钮    driver.navigate().back()
        //forward() 模拟浏览器前进按钮   driver.navigate().forward()
        //刷新页面  driver.navigate().refresh();
        //clear() 清除文本。
        //sendKeys(*value) 模拟按键输入。
        //click() 单击元素
        //submit()方法用于提交表单。 例如，在搜索框输入关键字之后的“回车” 操作， 就可以通过 submit()方法模拟.
        //getSize() 返回元素的尺寸。
        //getText() 获取元素的文本。
        //getAttribute(name) 获得属性值。
        //isDisplayed() 设置该元素是否用户可见。
        TouchScreen touch = webDriver.getTouch();
//        touch.up();
//        webDriver.quit();
    }
}

//通过前面例子了解到，可以使用click()来模拟鼠标的单击操作，现在的Web产品中提供了更丰富的鼠标交互方式， 例如鼠标右击、双击、悬停、甚至是鼠标拖动等功能。在WebDriver中，将这些关于鼠标操作的方法封装在ActionChains类提供。
//Actions 类提供了鼠标操作的常用方法：
//contextClick() 右击
//clickAndHold() 鼠标点击并控制
//doubleClick() 双击
//dragAndDrop() 拖动
//release() 释放鼠标
//perform() 执行所有Actions中存储的行为

//Keys()类提供了键盘上几乎所有按键的方法。 前面了解到， sendKeys()方法可以用来模拟键盘输入， 除此之 外， 我们还可以用它来输入键盘上的按键， 甚至是组合键， 如 Ctrl+A、 Ctrl+C 等。
//    //删除多输入的一个 m
//    input.sendKeys(Keys.BACK_SPACE);
//    //ctrl+a 全选输入框内容
//    input.sendKeys(Keys.CONTROL,"a");

//显示等待啊
// WebDriver driver = new ChromeDriver();
//    driver.get("https://www.baidu.com");
//
//    //显式等待， 针对某个元素等待
//    WebDriverWait wait = new WebDriverWait(driver,10,1);
//
//    wait.until(new ExpectedCondition<WebElement>(){
//      @Override
//      public WebElement apply(WebDriver text) {
//            return text.findElement(By.id("kw"));
//          }
//    }).sendKeys("selenium");
//
//    driver.findElement(By.id("su")).click();
//    Thread.sleep(2000);
//
//    driver.quit();
//  }
//driver： 浏览器驱动。 10： 最长超时时间， 默认以秒为单位。 1： 检测的的间隔（步长） 时间， 默认为 0.5s。
//2.隐式等待
//WebDriver 提供了几种方法来等待元素。
//implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。
//setScriptTimeout。异步脚本的超时时间。WebDriver可以异步执行脚本，这个是设置异步执行脚本脚本返回结果的超时时间。
//pageLoadTimeout。页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作，所以如果页面超过设置时间依然没有加载完成，那么WebDriver就会抛出异常。
////页面加载超时时间设置为 5s
//    driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
//    driver.get("https://www.baidu.com/");
//
//    //定位对象时给 10s 的时间, 如果 10s 内还定位不到则抛出异常
//    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//    driver.findElement(By.id("kw")).sendKeys("selenium");
//
//    //异步脚本的超时时间设置成 3s
//    driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
//
//    driver.quit();

//定位一组元素
//findElements(By.id())
//findElements(By.name())
//findElements(By.className())
//findElements(By.tagName())
//findElements(By.linkText())
//findElements(By.partialLinkText())
//findElements(By.xpath())
//findElements(By.cssSelector())

//有iframe的

//十三）多表单切换
//在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用，
// WebDriver 只能在一个页面上对元素识别与 定位， 对于 frame/iframe 表单内嵌页面上的元素无法直接定位。 这时就需要通过 switchTo().frame()方法将当前定 位的主体切换为 frame/iframe 表单的内嵌页面中。
//<html>
//  <body>
//    ...
//    <iframe id="x-URS-iframe" ...>
//      <html>
//         <body>
//           ...
//           <input name="email" >
//    WebDriver driver = new ChromeDriver();
//    driver.get("http://www.126.com");
//
//    WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe"));
//    driver.switchTo().frame(xf);
//    driver.findElement(By.name("email")).clear();
//    driver.findElement(By.name("email")).sendKeys("username");
//    driver.findElement(By.name("password")).clear();
//    driver.findElement(By.name("password")).sendKeys("password");
//    driver.findElement(By.id("dologin")).click();
//如果完成了在当前表单上的操作，则可以通过switchTo().defaultContent()方法跳出表单。
//    driver.switchTo().defaultContent();

//开启多个 窗口
//getWindowHandle()： 获得当前窗口句柄。
//getWindowHandles()： 返回的所有窗口的句柄到当前会话。
//switchTo().window()： 用于切换到相应的窗口，与上一节的switchTo().frame()类似，前者用于不同窗口的切换， 后者用于不同表单之间的切换。
//（十五）下拉框选择
//有时我们会碰到下拉框，WebDriver提供了Select类来处理下接框。
//如百度搜索设置的下拉框，如下图：


//带下拉框
//<select id="nr" name="NR">
//<option value="10" selected>每页显示 10 条</option>
//<option value="20">每页显示 20 条</option>
//<option value="50">每页显示 50 条</option>
//<select>
//    //<select>标签的下拉框选择
//    WebElement el = driver.findElement(By.xpath("//select"));
//    Select sel = new Select(el);
//    sel.selectByValue("20");
//    Thread.sleep(2000);
//

//（十六）警告框处理
//在 WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单，具体做法是使用switch_to_alert()方法定位到alert/confirm/prompt，然后使用text/accept/dismiss/sendKeys等方法进行操作。
//getText()： 返回 alert/confirm/prompt 中的文字信息。
//accept()： 接受现有警告框。
//dismiss()： 解散现有警告框。
//sendKeys(keysToSend)： 发送文本至警告框。
//keysToSend： 将文本发送至警告框。

//（十八）浏览器cookie操作
//有时候我们需要验证浏览器中Cookie是否正确， 因为基于真实Cookie的测试是无法通过白盒测试和集成测试进行的。WebDriver提供了操作Cookie的相关方法可以读取、 添加和删除Cookie信息。
//WebDriver 操作Cookie的方法：
//getCookies() 获得所有 cookie 信息。
//getCookieNamed(String name) 返回字典的key为“name”的Cookie信息。
//addCookie(cookie dict) 添加Cookie。“cookie_dict”指字典对象，必须有 name和value值。
//deleteCookieNamed(String name) 删除Cookie 信息。 “name”是要删除的 cookie的名称； “optionsString” 是该Cookie的选项，目前支持的选项包括“路径” ， “域” 。
//deleteAllCookies() 删除所有 cookie 信息。
//    Cookie c1 = new Cookie("name", "key-aaaaaaa");
//    Cookie c2 = new Cookie("value", "value-bbbbbb");
//    driver.manage().addCookie(c1);
//    driver.manage().addCookie(c2);
//
//    //获得 cookie
//    Set<Cookie> coo = driver.manage().getCookies();
//    System.out.println(coo);
//
//    WebDriver driver = new ChromeDriver();
//
//
//    //设置浏览器窗口大小
//    driver.manage().window().setSize(new Dimension(700, 600));
//    driver.get("https://www.baidu.com");
//
//
//    //进行百度搜索
//    driver.findElement(By.id("kw")).sendKeys("webdriver api");
//    driver.findElement(By.id("su")).click();
//    Thread.sleep(2000);
//
//
//    //将页面滚动条拖到底部
//    ((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");
//    Thread.sleep(3000);
//

//（二十）获取窗口截图
//自动化用例是由程序去执行，因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存，
// 那么通过图片就可以非常直观地看出出错的原因。 WebDriver提供了截图函数getScreenshotAs()来截取当前窗口。
//File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
//    try {
//      FileUtils.copyFile(srcFile,new File("d:\\screenshot.png"));
//    } catch (IOException e) {
//      e.printStackTrace();
//    }
